// Copyright 2012 Mozilla Corporation. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-initializenumberformat
description: >
    Tests that the options numberingSystem and calendar can be  set through
    either the locale or the options.
author: Norbert Lindenberg, Daniel Ehrenberg
---*/

function Test() {
    let defaultLocale = new Intl.NumberFormat().resolvedOptions().locale;

    let supportedNumberingSystems = ["latn", "arab"].filter(nu =>
      new Intl.NumberFormat(defaultLocale + "-u-nu-" + nu)
        .resolvedOptions().numberingSystem === nu
    );

    let options = [
        {key: "nu", property: "numberingSystem", type: "string", values: supportedNumberingSystems},
    ];

    options.forEach(function (option) {
        let numberFormat, opt, result;
    
        // find out which values are supported for a property in the default locale
        let supportedValues = [];
        option.values.forEach(function (value) {
            opt = {};
            opt[option.property] = value;
            numberFormat = new Intl.NumberFormat([defaultLocale], opt);
            result = numberFormat.resolvedOptions()[option.property];
            if (result !== undefined && supportedValues.indexOf(result) === -1) {
                supportedValues.push(result);
            }
        });
    
        // verify that the supported values can also be set through the locale
        supportedValues.forEach(function (value) {
            numberFormat = new Intl.NumberFormat([defaultLocale + "-u-" + option.key + "-" + value]);
            result = numberFormat.resolvedOptions()[option.property];
            assert.sameValue(result, value, "Property " + option.property + " couldn't be set through locale extension key " + option.key + ".");
        });
    
        // verify that the options setting overrides the locale setting
        supportedValues.forEach(function (value) {
            let otherValue;
            option.values.forEach(function (possibleValue) {
                if (possibleValue !== value) {
                    otherValue = possibleValue;
                }
            });
            if (otherValue !== undefined) {
                opt = {};
                opt[option.property] = value;
                numberFormat = new Intl.NumberFormat([defaultLocale + "-u-" + option.key + "-" + otherValue], opt);
                result = numberFormat.resolvedOptions()[option.property];
                assert.sameValue(result, value, "Options value for property " + option.property + " doesn't override locale extension key " + option.key + ".");
            }
        });
    });

}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
